package productions;

import exceptions.ParserException;
import lexico.ErrorTable;
import lexico.SymbolTable;
import lexico.Token;
import lexico.TokenClass;
import sintatico.ErrorTableParser;

/**
 *
 * @author Salomao e Pedro
 */
public class LeiaProduction extends AbstractProductionRule {
    /* Muitos dos métodos irão precisar de algo assim: */

    private static LeiaProduction instance = new LeiaProduction();

    public static LeiaProduction getInstance() {
        return instance;
    }


    /**
     * Regra: leia        :    'leia' '(' IDENTIFIER (',' IDENTIFIER)* ')' ';';
     * @return
     * @throws ParserException
     */
    @Override
    public boolean analyze(SymbolTable st, ErrorTable et) throws ParserException {
        if (!basicParse(st, TokenClass.KEYWORD_LEIA)) {
            return false;
        }
        if (!basicParse(st, TokenClass.DELIMITER_OPENING_PARENTHESIS)) {
            return skipUntilSynchronize(st, et, "Era esperado um '('");
        }
        if (!basicParse(st, TokenClass.IDENTIFIER)) {
            return skipUntilSynchronize(st, et, "Era esperado um identificador.");
        }

        while (basicParse(st, TokenClass.DELIMITER_COMMA)) {
            if (!basicParse(st, TokenClass.IDENTIFIER)) {
                return skipUntilSynchronize(st, et, "Era esperado um identificador.");
            }
        }

        if (!basicParse(st, TokenClass.DELIMITER_CLOSING_PARENTHESIS)) {
            return skipUntilSynchronize(st, et, "Era esperado um ')'");
        }
        if (!basicParse(st, TokenClass.DELIMITER_SEMICOLON)) {
            return skipUntilSynchronize(st, et, "Era esperado um ';'");
        }

        return true;
    }

    @Override
    protected void populateFirst() {
        first.add(TokenClass.KEYWORD_LEIA);
    }

    @Override
    protected void populateFollow() {
        //from comandos follow
        follow.add(TokenClass.DELIMITER_CLOSING_CURLY_BRACKET);
    }

}
